#include "widget.h"
#include "./ui_widget.h"

QSerialPort *serial = new QSerialPort;

//构造函数 类创建后运行
Widget::Widget(QWidget *parent):QWidget(parent),ui(new Ui::Widget)
{
    //设置界面
    ui->setupUi(this);
    //绑定串口接收槽函数
    ui->debug_textEdit->setReadOnly(true);  // 确保只读（可选，增强保险）
    ui->debug_textEdit->setTextInteractionFlags(Qt::NoTextInteraction); // 核心：禁止所有用户交互
    QObject::connect(serial,&QSerialPort::readyRead,this,&Widget::receive_data);

    //遍历设备上空闲的串口
    foreach (const QSerialPortInfo &serial_info,QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(serial_info);
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->serial_port_Box->addItem(serial.portName());
            serial.close();
        }
    }
}

//析构函数 类删除后运行
Widget::~Widget()
{
    qDebug()<<"exit app";
    delete ui;
}

//设置串口属性
int Widget:: set_serial(void)
{
    QSerialPort::BaudRate CombaudRate;
    QSerialPort::DataBits ComdataBits;
    QSerialPort::StopBits ComstopBits;
    QSerialPort::Parity   ComParity;
    QSerialPort::FlowControl comFlowControl;
    //获取波特率
    if(ui->serial_baudrate_Box->currentText()=="1200")
    {
        CombaudRate = QSerialPort::Baud1200;
    }
    else if(ui->serial_baudrate_Box->currentText()=="2400")
    {
        CombaudRate = QSerialPort::Baud2400;
    }
    else if(ui->serial_baudrate_Box->currentText()=="4800")
    {
        CombaudRate = QSerialPort::Baud4800;
    }
    else if(ui->serial_baudrate_Box->currentText()=="9600")
    {
        CombaudRate = QSerialPort::Baud9600;
    }
    else if(ui->serial_baudrate_Box->currentText()=="19200")
    {
        CombaudRate = QSerialPort::Baud19200;
    }
    else if(ui->serial_baudrate_Box->currentText()=="38400")
    {
        CombaudRate = QSerialPort::Baud38400;
    }
    else if(ui->serial_baudrate_Box->currentText()=="57600")
    {
        CombaudRate = QSerialPort::Baud57600;
    }
    else if(ui->serial_baudrate_Box->currentText()=="115200")
    {
        CombaudRate = QSerialPort::Baud115200;
    }

    //获取数据位
    if(ui->serial_data_Box->currentText()=="5")
    {
        ComdataBits = QSerialPort::Data5;
    }
    else if(ui->serial_data_Box->currentText()=="6")
    {
        ComdataBits = QSerialPort::Data6;
    }
    else if(ui->serial_data_Box->currentText()=="7")
    {
        ComdataBits = QSerialPort::Data7;
    }
    else if(ui->serial_data_Box->currentText()=="8")
    {
        ComdataBits = QSerialPort::Data8;
    }

    //获取停止位
    if(ui->serial_StopBits_Box->currentText()=="1")
    {
        ComstopBits = QSerialPort::OneStop;
    }
    else if(ui->serial_StopBits_Box->currentText()=="2")
    {
        ComstopBits = QSerialPort::TwoStop;
    }

    //获取校验方式
    if(ui->serial_Parity_Box->currentText()=="无检验")
    {
        ComParity = QSerialPort::NoParity;
    }
    else if(ui->serial_Parity_Box->currentText()=="偶校验")
    {
        ComParity = QSerialPort::EvenParity;
    }
    else if(ui->serial_Parity_Box->currentText()=="奇校验")
    {
        ComParity = QSerialPort::OddParity;
    }
    else if(ui->serial_Parity_Box->currentText()=="Space")
    {
        ComParity = QSerialPort::SpaceParity;
    }
    else if(ui->serial_Parity_Box->currentText()=="Mark")
    {
        ComParity = QSerialPort::MarkParity;
    }

    //获取流控制方式
    if(this->ui->serial_FlowControl_Box->currentText() == "无控制")
    {
        comFlowControl = QSerialPort::NoFlowControl;
    }
    if(this->ui->serial_FlowControl_Box->currentText() == "硬件控制")
    {
        comFlowControl = QSerialPort::HardwareControl;
    }
    if(this->ui->serial_FlowControl_Box->currentText() == "软件控制")
    {
        comFlowControl = QSerialPort::SoftwareControl;
    }
    if(serial->setBaudRate(CombaudRate)!=1)//设置波特率
    {
        return 0;
    }
    if(serial->setDataBits(ComdataBits)!=1)//设置数据位
    {
            return 0;
    }
    if(serial->setParity(ComParity)!=1)//设置校验位
    {
        return 0;
    }
    if(serial->setStopBits(ComstopBits)!=1)//设置停止位
    {
        return 0;
    }
    if(serial->setFlowControl(comFlowControl)!=1)//设置控制位
    {
        return 0;
    }
    return 1;
}

bool open_button_flag=1;//串口按钮状态 1是打开 0是关闭
//打开/关闭串口点击信号的槽函数
void Widget::on_open_serialport_button_clicked()
{
    if(open_button_flag == 1)//串口状态
    {
        open_button_flag = 0;
        ui->open_serialport_button->setText("关闭串口");
        serial->setPortName(ui->serial_port_Box->currentText());
        if(serial->open(QIODevice::ReadWrite))
        {
            ui->debug_textEdit->insertPlainText("打开成功\n");
            //qDebug()<<"打开成功";
            if(set_serial())//设置串口属性
            {
                ui->debug_textEdit->insertPlainText("设置串口属性成功\n");
                //打开串口禁止修改属性
                ui->serial_FlowControl_Box->setEnabled(false);
                ui->serial_Parity_Box->setEnabled(false);
                ui->serial_StopBits_Box->setEnabled(false);
                ui->serial_baudrate_Box->setEnabled(false);
                ui->serial_data_Box->setEnabled(false);
                ui->serial_port_Box->setEnabled(false);
                //qDebug()<<"设置串口属性成功";
            }
            else
            {
                ui->debug_textEdit->insertPlainText("设置串口属性失败\n");
                //qDebug()<<"设置串口属性失败";
            }
        }
        else
        {
            open_button_flag = 1;
            ui->debug_textEdit->insertPlainText("打开失败\n");
            //qDebug()<<"打开失败";
        }
        QString debug_info = QString("端口名：%1 \n").arg(serial->portName());
        ui->debug_textEdit->insertPlainText(debug_info);
    }else
    {
        open_button_flag = 1;
        serial->close();//关闭串口
        //qDebug()<<"关闭串口";
        ui->debug_textEdit->insertPlainText("关闭串口\n");
        //关闭串口后才能修改串口属性
        ui->serial_FlowControl_Box->setEnabled(true);
        ui->serial_Parity_Box->setEnabled(true);
        ui->serial_StopBits_Box->setEnabled(true);
        ui->serial_baudrate_Box->setEnabled(true);
        ui->serial_data_Box->setEnabled(true);
        ui->serial_port_Box->setEnabled(true);
        ui->open_serialport_button->setText("打开串口");//修改按钮名称
    }
}

//发送按钮点击槽函数
void Widget::on_send_Button_clicked()
{
    //获取发送区内容
    QString send_buf = ui->send_textEdit->toPlainText();
    //插入换行符
    send_buf.insert(send_buf.length(),"\n");
    //发送数据
    serial->write(send_buf.toUtf8());
}

//串口接收槽函数
void Widget::receive_data()
{
    QByteArray receive_buf;
    //接收数据
    receive_buf = serial->readAll();
    //插入换行符
    //receive_buf.insert(receive_buf.length(),"\n");""
    //插入时间戳
    if(ui->timestamp_checkBox->checkState() == Qt::Checked)
    {
        QTime time = QTime::currentTime();//获取时间
        QString time_str = time.toString("HH:mm:ss");//格式化时间
        receive_buf.insert(0,time_str.toUtf8()+" >>> ");
    }
    //判断不为空后显示
    if(!receive_buf.isEmpty())
    {
        //显示数据
        ui->debug_textEdit->insertPlainText(receive_buf);
        // 移动光标到文档末尾（自动滚动到底部）
        ui->debug_textEdit->moveCursor(QTextCursor::End);
    }
    //清除接收数据
    receive_buf.clear();
}

